热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

都会|事实_24年了,终于有人发现curl的这个Bug了

篇首语:本文由编程笔记#小编为大家整理,主要介绍了24年了,终于有人发现curl的这个Bug了相关的知识,希望对你有一定的参考价值。这是一个关于cookie、

篇首语:本文由编程笔记#小编为大家整理,主要介绍了24 年了,终于有人发现 curl 的这个 Bug 了相关的知识,希望对你有一定的参考价值。


这是一个关于 COOKIE、互联网代码和 CVE(通用漏洞披露)的故事。

curl 作者 Daniel Stenberg 近日在个人博客分享了一个存在 23.9 年的 curl 漏洞。curl 是常用的命令行工具,用来请求 Web 服务器,于 1997 年首次发行。

据 Stenberg 透露,这个漏洞是在 curl 发布后的第 201 天引入的,但是直到第 8930 天,漏洞才修复好。一个持续了 23.9 年的漏洞背后有着怎样的故事?

一切还得从 1998 年说起。


curl 4.9 与 COOKIE

1998 年 10 月,Stenberg 带领团队推出了 curl 4.9 版本。当时,听过或用过 curl 的人还少得可怜。几个月之后,curl 官网才宣布新版本的下载量达到了 300。那时,无论从何种意义上讲, curl 都还很小众。

curl 4.9 作为第一个带有 “COOKIE 引擎” 的版本,可以接收 HTTP COOKIE、解析、识别,并在后续的请求中把 COOKIE 正确地返回。在 curl 中,处理 COOKIE 的大部分代码都是 Stenberg 编写的。

那会,COOKIE  还没有明确的规范,仅有的一份描述 COOKIE 工作原理的规范,是一份由 Netscape 管理的文档 COOKIE_spec(感兴趣的同学可以戳链接查看文档副本:https://curl.se/rfc/COOKIE_spec.html)。这份文档并不完善,有不少信息需要通过查看其它客户端才能了解到。

Stenberg 在实现处理 COOKIE 的代码时,就是参考了这份文档以及当时浏览器的大致处理方式。

此后十年,IETF(互联网工程任务组)一直在努力创建 COOKIE 规范,但均以失败而告终。这些早期 COOKIE 规范的创建者可能觉得,他们创建了标准,世界就会情不自禁地遵守它们,但事实并非如此。COOKIE 的特殊之处在于,有很多不同的作者、代码库和网站实现了它。因此,很难从根本上改变它们的工作方式。

直到 2011 年,COOKIE RFC 正式发布了,它记录并解释了 COOKIE 实际的使用方式,这可以说是真正意义上的 COOKIE 规范。Stenberg 本人也参与了规范的制定过程,并在其中阐述了自己的观点和意见。对于这份规范的内容,虽然 Stenberg 并不完全赞同,但与此前的各种 COOKIE 规范相比,COOKIE RFC 的确是一个巨大的进步。


COOKIE 双重语法带来的挑战

一开始,新的 COOKIE 规范并没有给 Stenberg 造成困扰,但很快,规范的特殊编写方式让 Stenberg 倍感头疼:它针对服务器如何发送 COOKIE 提供了一种字段语法,而针对客户端应该接受什么样的 COOKIE 提供了另一种语法。也就是说,同样的 COOKIE,需要两种语法。

这有两个很直接的缺点:


  1. 规范很难阅读。你很容易就停留在其中一种语法上,以为那就是适合自己用例的,但却没有意识到角色描述是错误的。

  2. 定义如何发送 COOKIE 的语法其实并不重要,因为如何接收和处理 COOKIE 都是由客户端决定的。现有的大型 COOKIE 解析器(浏览器)有一定程度的自由决定自己接受什么,所以没人注意,也没人关心服务器是否严格遵守了规范中的语法。与此同时,COOKIE 规范也在持续更新。从几年前开始,IETF 就一直在修订和更新 2011 年的 COOKIE 规范,计划将世界上一些已实际投入使用的 COOKIE 扩展添加到规范中。这项 COOKIE 规范更新工作被称为 6265bis。

curl 也同步进行更新,以确保符合 RFC 6265bis 草案版本的规定。

但是,双重语法仍然是 COOKIE 规范文档中悬而未决的问题。

随着时间的推移,COOKIE 的发展变得缓慢。在过去的几十年里,HTTP 规范也就更新了有限的几次,但值得一提的是,HTTP 服务器实现已经实施了更严格的解析策略:



如果传入的 HTTP 请求看上去“非法”或格式不正确,那么 HTTP 服务器就会提前拒绝,把它们挡在门外。对于请求中的控制代码尤其如此。如果你试图将一个包含控制代码(这里的控制代码指的是介于 1 到 31 之间的字节值,不包括 9,9 是 TAB)的请求发送到一个相当新的 HTTP 服务器,那么服务器很可能会拒绝,并返回 400 响应代码。从 2016 年 12 月发布的 2.4.25 版本开始,HTTP 服务器 Apache httpd 就默认启用了此行为。最新版本的 nginx 似乎也是这样做的。


如果是现在设计 COOKIE,那么肯定会有所不同。

设置 COOKIE 的网站把 COOKIE 发送到客户端,对于其发送的每个 COOKIE,它都会设置多个属性。尤其是当需要客户端发回 COOKIE 时,它会设置匹配参数。

在 COOKIE 的这些参数中,其中有一个是 domain,客户端发送 COOKIE 时要匹配它。服务器www.example.com可以设置 COOKIE 的有效范围为整个example.com域,这时,客户端在访问second.example.com 时也会发送 COOKIE。也就是说,服务器可以将 COOKIE 设置为适用于“兄弟站点”。

值得一提的是,1998 年添加到 curl 中的 COOKIE 代码在接受内容方面相当自由,当然,多年来也经过了不少调整和完善,不过它始终与现实世界的网站保持了兼容。对于那部分代码,Stenberg 修改的主要动力始终是为了使 curl 的 COOKIE 处理方式与其他已有的使用 COOKIE 的代理保持基本一致,并可以互操作。


curl 的 Bug 详情与修复方案

2022 年 6 月底,Stenberg 收到了一份报告,报告怀疑 curl 中存在安全问题。正是这份报告促使 curl 发布了 CVE-2022-35252。

事实证明,源于 1998 年的旧 COOKIE 代码,会接受包含控制代码的 COOKIE。控制代码可以是名称或内容的一部分,如果用户启用了“COOKIE 引擎”,那么 curl 就会存储那些 COOKIE,并在后续的请求中将它们发送回来。

例如,curl 会接受下面这样的 COOKIE:

Set-COOKIE: name^a=content^b; domain=.example.com

^a 和 ^b 表示控制代码。由于域可以将 COOKIE 标记为适用于其他主机,、所以发送到域中所有主机的请求都会包含这个 COOKIE。

当 curl 将类似那样的一个 COOKIE 发送到 HTTP 服务器时,它的外发请求中会包含下面这样一个 header 字段:

COOKIE: name^a=content^b

对此,Apache httpd 及其他服务器的默认配置都会返回 400。一个脚本或应用程序在收到这样的 COOKIE 后,如果后续的请求中还继续发送 COOKIE,就会遭到拒绝。

Stenberg 复盘后发现,COOKIE 规范 RFC 6265 5.2 节确实说了,客户端应该丢弃包含控制代码的 COOKIE,但这部分对用户来说理解起来比较难,需要对文档有深入的研究才能发现。此外,规范并没有提及“控制代码”或是字节值范围。

Stenberg 认为,要弄清楚主流浏览器是怎么做的还是比较容易的,因为它们的源代码很容易获得。事实证明,Chrome 和 Firefox 都已经忽略了包含以下任何字节的传入 COOKIE:

%01-%08 / %0b-%0c / %0e-%1f / %7f

其中不包含 %09(TAB)和 %0a / %0d(行结束符)。

Bug 修复方面,Stenberg 表示,curl 的修复补丁处理方式非常简单:拒绝包含一个或多个禁用字节值的 COOKIE 字段。Stenberg 认为,这种修改基本是没有风险的。


写在最后

推算起来,有漏洞的代码从 curl 4.9 版本开始就一直存在,curl 7.85.0 版本才完成修复。整个历程有 8729 天(23.9 年)。也就是说,这个 Bug 是在项目发布的第 201 天引入的,到第 8930 天才修复。

Stenberg 认为,代码在发布时是没什么问题的,并且在用户的使用过程中,也基本没有产生什么问题。它的问题出在,HTTP 服务开始拒绝可能的恶意 HTTP 请求时。如此一来,这段代码就变成了一种拒绝服务,这或多或少会带来一些副作用。

或许,这个 Bug 诞生于 RFC 6265 发布之时。或许,它诞生于 HTTP 服务器开始拒绝这些请求时。不管怎样,这个 Bug 创造了一个新的项目记录:它是第四个被发现之前存在了 8000 多天的 Bug。


推荐阅读
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • 目录浏览漏洞与目录遍历漏洞的危害及修复方法
    本文讨论了目录浏览漏洞与目录遍历漏洞的危害,包括网站结构暴露、隐秘文件访问等。同时介绍了检测方法,如使用漏洞扫描器和搜索关键词。最后提供了针对常见中间件的修复方式,包括关闭目录浏览功能。对于保护网站安全具有一定的参考价值。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • 31.项目部署
    目录1一些概念1.1项目部署1.2WSGI1.3uWSGI1.4Nginx2安装环境与迁移项目2.1项目内容2.2项目配置2.2.1DEBUG2.2.2STAT ... [详细]
  • svnWebUI:一款现代化的svn服务端管理软件
    svnWebUI是一款图形化管理服务端Subversion的配置工具,适用于非程序员使用。它解决了svn用户和权限配置繁琐且不便的问题,提供了现代化的web界面,让svn服务端管理变得轻松。演示地址:http://svn.nginxwebui.cn:6060。 ... [详细]
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
  • LVS实现负载均衡的原理LVS负载均衡负载均衡集群是LoadBalance集群。是一种将网络上的访问流量分布于各个节点,以降低服务器压力,更好的向客户端 ... [详细]
  • .NetCoreWebApi生成Swagger接口文档的使用方法
    本文介绍了使用.NetCoreWebApi生成Swagger接口文档的方法,并详细说明了Swagger的定义和功能。通过使用Swagger,可以实现接口和服务的可视化,方便测试人员进行接口测试。同时,还提供了Github链接和具体的步骤,包括创建WebApi工程、引入swagger的包、配置XML文档文件和跨域处理。通过本文,读者可以了解到如何使用Swagger生成接口文档,并加深对Swagger的理解。 ... [详细]
  • 本文介绍了禅道作为一款国产开源免费的测试管理工具的特点和功能,并提供了禅道的搭建和调试方法。禅道是一款B/S结构的项目管理工具,可以实现组织管理、后台管理、产品管理、项目管理和测试管理等功能。同时,本文还介绍了其他软件测试相关工具,如功能自动化工具和性能自动化工具,以及白盒测试工具的使用。通过本文的阅读,读者可以了解禅道的基本使用方法和优势,从而更好地进行测试管理工作。 ... [详细]
  • Tomcat安装与配置教程及常见问题解决方法
    本文介绍了Tomcat的安装与配置教程,包括jdk版本的选择、域名解析、war文件的部署和访问、常见问题的解决方法等。其中涉及到的问题包括403问题、数据库连接问题、1130错误、2003错误、Java Runtime版本不兼容问题以及502错误等。最后还提到了项目的前后端连接代码的配置。通过本文的指导,读者可以顺利完成Tomcat的安装与配置,并解决常见的问题。 ... [详细]
  • 负载均衡_Nginx反向代理动静分离负载均衡及rewrite隐藏路径详解(Nginx Apache MySQL Redis)–第二部分
    nginx反向代理、动静分离、负载均衡及rewrite隐藏路径详解 ... [详细]
author-avatar
此人已死_0824
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有